/**************************************************************
 * 
 * Copyright ? 2014，北京福富软件技术股份有限公司
 * All Rights Reserved.
 * ------------------------------------------------------------
 * 文件名称：Tree.java
 * 文件摘要：将list转成Tree结构的list工具类
 * 初始版本：V1.0.0
 * 初始作者：lhong
 * 完成日期：2014-06-04
 * 
 **************************************************************/
package com.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**************************************************************************
 * 
 * 类名：Tree<br>
 * <br>
 * 功能：将list转成Tree结构的list工具类<br>
 * <br>
 * 作者：lhong 2014-06-04<br>
 * <br>
 * 属性列表：<br>
 * <br>
 * 方法列表：<br>
 * 		...<br>
 * <br>
 * 修改记录：<br>
 * 		日期				修改人			修改说明<br>		
 * 
 **************************************************************************/
public class Tree {
	
	private List list;									//树的集合
	
	private int rootId = 0;								//根ID
	
	/**************************************************************************
	 * 
	 * 函数名：public Elem(List list)<br>
	 * <br>
	 * 功能：构造方法<br>
	 * <br>
	 * 作者：lhong 2014-06-04<br>
	 * <br>
	 * 参数表：<br>
	 * 		List list			->	树的集合<br>
	 * <br>
	 * 返回值：<br>
	 * 		无<br>
	 * <br>
	 * 修改记录：<br>
	 * 		日期				修改人			修改说明<br>
	 * 
	 **************************************************************************/
	public Tree(List list){
		this.list = list;
	}
	
	/**************************************************************************
	 * 
	 * 函数名：public Tree(List list,int rootId)<br>
	 * <br>
	 * 功能：构造方法<br>
	 * <br>
	 * 作者：lhong 2014-06-04<br>
	 * <br>
	 * 参数表：<br>
	 * 		List list			->	树的集合<br>
	 * 		int rootId			->	根ID<br>
	 * <br>
	 * 返回值：<br>
	 * 		无<br>
	 * <br>
	 * 修改记录：<br>
	 * 		日期				修改人			修改说明<br>
	 * 
	 **************************************************************************/
	public Tree(List list,int rootId){
		this.list = list;
		this.rootId = rootId;
	}
	
	
	/**************************************************************************
	 * 
	 * 函数名：	public Object getTree<br>
	 * <br>
	 * 功能：将list转换成tree结构的List对像<br>
	 * <br>
	 * 作者：lhong 2014-06-04<br>
	 * <br>
	 * 参数表：<br>
	 * 		无<br>
	 * <br>
	 * 返回值：<br>
	 * 		List	->	tree结构的List对像<br>
	 * <br>
	 * 修改记录：<br>
	 * 		日期				修改人			修改说明<br>
	 * 
	 **************************************************************************/
	public List getTree(){
		List list = new ArrayList();
		Method method = null;
		Object o = null;
		for (int i = 0; i < this.list.size(); i++) {
			o = this.list.get(i);
			try {
				if(method==null)
					method = o.getClass().getMethod("isRootId", int.class);
				Boolean flag = (Boolean)method.invoke(o, this.rootId);
				if(flag){
					list.add(o);
					addChildList(o);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return list;
	}
	
	
	
	private void addChildList(Object o){
		Method method = null;
		Object tree = null;
		for (int i = 0; i < this.list.size(); i++) {
			tree = this.list.get(i);
			try {
				if(method==null)
					method = o.getClass().getMethod("addChild", Object.class);
				Boolean flag = (Boolean)method.invoke(o, tree);
				if(flag)
					addChildList(tree);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
